Git vorige versies inspecteren
- git checkout
git checkout
Met git checkout
kan je op drie manieren uitchecken:
- bestanden
- commits
- branches
Hier houden we ons enkel bezig met de eerste twee manieren van uitchecken.
Als je een commit uit checkt wordt de gehele werkmap gelijk aan deze commit. Daarmee kan je een oudere versie van je project bekijken zonder dat je de laatste versie wijzigt.
Als je een bestand uit checkt kan je een oudere versie van dat bestand bekijken en blijft de rest van de werkmap ongewijzigd.
Wat hier aan voorafgaat
De toestand van de myap werkmap en de repo is zoals ze is nadat je de voorbeelden in Git bestanden neerleggen hebt gemaakt.
We voegen een gedicht toe omdat we meer dan een bestand in onze werkmap nodig hebben. Sla het op onder de naam Vondel.txt.
Joost van den Vondel
Geuze-Vesper of Ziekentroost voor de Vierenentwintig
Had hij Holland dan gedragen,
Onder 't hart,
Tot zijn afgeleefde dagen,
Met veel smart,
Om 't meinedig zwaard te laven,
Met zijn bloed,
En te mesten kraai en raven
Op zijn goed ?
Voeg het gedicht toe aan de verzamelplaats met git add Vondel.txt
. En leg het neer met de boodschap: git commit -m "Vondel eerste versie toegevoegd"
.
Je hebt dan de volgende commit geschiedenis:
In de praktijk
git checkout master
Daarmee keer je terug naar de master tak. Takken zien we later. Het enige wat je nu moet weten is dat je met deze instructie terugkeert naar de werkversie van je project.
git checkout <commit> <file>
Hiermee check je een vorige versie van een bestand uit. Het bestand dat in de werkmap staat wordt een exacte kopie van het bestand dat in de uitgecheckte commit staat en het wordt toegevoegd aan de verzamelplaats.
Neem aan dat je terug wilt naar de eerste versie om met deze verder te gaan. Dat wil zeggen dat je de eerste versie weer in je werkmap moet zien te krijgen. Als het slechts om één bestand gaat, kan je een bestand uit een vorige commit uit checken en die terug in de werkmap zetten en op de verzamelplaats. Hier zie je wat er gebeurd als een bestand uit checkt:
git checkout <commit>
Alle bestanden in de werkmap worden geüpdated in overeenkomst met de opgegeven commit. Je kan een commit hash gebruiken of een tag als argument van de commit. Dat plaatst je in een detached HEAD toestand.
Uitchecken is een is read-only operatie. Je kan je repo niet beschadigen als je een oudere versie bekijkt. De werkversie in je werkmap blijft ongwijzigd staan in de master branch (zie Branches). Tijdens de dagdagelijkse ontwikkeling wijst de HEAD naar master of naar een andere lokale tak, maar als je een vorige commit uit checkt, wijst HEAD niet langer naar een tak, maar naar een commit. Dit heet een "detached HEAD" toestand en kan als volgt gevisualiseerd worden:
Let erop dat wanneer je één enkel bestand uitcheckt, de werkmap wel degelijk veranderd is. Bij het uitchecken van een commit wordt de head bij manier spreken losgemaakt van de Master en verschoven naar de uitgecheckte commit.
Verbeeld je het volgende scenario in. Ik wil mijn werkmap terugzetten naar de toestand waarin die was op het moment van voor de commit Vera versie twee.
C:\myap>git log --oneline 9af1508 Vera eerste versie hersteld f2afd87 Vondel eerste versie toegevoegd 76367c9 Vera derde versie ac43111 Vera tweede versie b3a2046 Vera eerste versie C:\myap>git checkout ac43111 Note: checking out 'ac43111'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at ac43111... Vera tweede versie C:\myap>dir Volume in drive C is Windows Volume Serial Number is C6F4-3FE3 Directory of C:\myap 26/01/2017 12:19 <DIR> . 26/01/2017 12:19 <DIR> .. 25/01/2017 14:39 14 .gitignore 26/01/2017 12:19 132 Vera.txt 2 File(s) 146 bytes 2 Dir(s) 99 809 517 568 bytes free C:\myap>type Vera.txt Jan Engelman Vera Janacopoulos Cantilene Ambrosia, wat vloeit mij aan? uw schedelveld is koeler maan en alle appels blozen C:\myap>git checkout master Previous HEAD position was ac43111... Vera tweede versie Switched to branch 'master' C:\myap>dir Volume in drive C is Windows Volume Serial Number is C6F4-3FE3 Directory of C:\myap 26/01/2017 12:19 <DIR> . 26/01/2017 12:19 <DIR> .. 25/01/2017 14:39 14 .gitignore 26/01/2017 12:19 83 Vera.txt 26/01/2017 12:19 265 Vondel.txt 3 File(s) 362 bytes 2 Dir(s) 99 809 517 568 bytes free C:\myap>
Door de checkout komt je werkmap overeen precies overeen met de toestand van de ac43111 commit. Je kan de bestanden inspecteren, het project in de werkmap compileren, tests uitvoeren, en zelfs bestanden bewerken zonder je zorgen te maken over het verliezen van de huidige stand van zaken van het project. Niets wat je doet hier zal in je archief opgeslagen worden. Maar om verder te ontwikkelen, moet je terug naar de "huidige" staat van je project:
git checkout master
Dit veronderstelt wel dat je aan ontwikkelen bent in de standaard master tak. Takken zullen we nog uitgebreid bestuderen.